帮助 patch 查找不精确的匹配

本文是对这篇 diff 文档的翻译

对于上下文差异和长度较小的正常补丁,patch 可以检测 patch 中的行号何时是不正确的,并且会尝试找到应用每个 hunk 的正确位置。 第一次尝试时,patch 会使用 hunk 的原有行号加上或减去应用先前的 hunk 产生的偏移。如果这不是正确的位置,patch 会分别向前向后扫描来寻找和 hunk 中的上下文匹配的位置。

首先,patch 寻找上下文的所有行都能匹配上的位置。如果找不到这样的位置,并且 patch 读取的是上下文补丁或标准补丁,同时最大模糊参数(fuzz factor)被设置为大于等于1, 则 patch 会进行下一次扫描。本次扫描时,忽略(即不包含)上下文部分的第一行和最后一行。如果依然找不到合适的位置,且模糊参数大于等于2,则进行下一次扫描, 并忽略上下文的前两行和最后两行。如果依旧找不到且模糊参数更大,则会继续此过程。

--fuzz=lines(-F lines) 选项设置最大模糊参数为 lines。这个选项仅对有上下文的补丁和标准化补丁生效。lines 代表在搜索应用 hunk 的位置时最大忽略的上下文行数。 注意,较大的模糊参数将会增加补丁应用出错的概率。默认的模糊参数为2。将其设置为超过 diff 上下文的值(一般为3)是没有意义的。

如果 patch 找不到应用 hunk 的位置,则它会将无法应用的 hunk 写入对应的拒绝文件(.rej)文件。无论补丁是什么格式,拒绝文件都会以上下文格式写入无法应用的 hunk。 拒绝文件中的行号与 patch 文件中的行号不同:它显示的是patch认为失败的 hunk 在新文件中的大致位置。

如果使用了--verbose选项,那么 patch 将会在运行结束时给出一些关于失败和成果的更详细的信息。如果应用 hunk 失败了,则会打印出 patch 认为 hunk 在新文件中应该在哪一行。 如果这与 diff 中指定的行号不一致,则会打印出偏移量。如果某个偏移量过大,则该 hunk 应用的位置可能是错误的。patch 还会指出它在应用时是否使用了模糊因子进行匹配。



Fel!xpace
ABOUT